package com.webserver.controller;

import com.webserver.http.HttpServletRequest;
import com.webserver.http.HttpServletResponse;
import com.webserver.vo.User;

import java.io.*;

/**
 * 处理与用户相关的请求操作
 */
public class UserController {
    //该File对象表示多有用户信息保存的目录
    private static File userDir;

    static {
        userDir = new File("./users");
        if (!userDir.exists()){
            userDir.mkdirs();
        }
    }
    /**
     * 处理用户注册操作的请求
     */
    public void reg(HttpServletRequest request, HttpServletResponse response){
        System.out.println("开始处理注册...");
        //1获取用户在注册页面上表单中提交上来的注册信息
        //调用getParameter用于获取浏览器传递过来的参数.
        //参数与表单中输入框的名字一致
        String username = request.getParameter("username");
        String password = request.getParameter("password");
        String nickname = request.getParameter("nickname");
        String ageStr = request.getParameter("age");
        System.out.println(username+","+password+","+nickname+","+ageStr);
        /*
        必要的验证工作：
        1：要求上述四个信息用户必须在页面上输入，不能有null的
        2：年龄还必须是一个数字格式
        否则直接影响一个页面;reg_info_error.html
        该页面居中显示一行字：注册失败，注册信息输入有误，请重新注册.
         */
        if(username==null||password==null||nickname==null||ageStr==null
                || !ageStr.matches("[0-9]+")) {
            File file = new File("./webbapps/myweb/reg_info_err.html");
            response.setEntity(file);
            return;
        }
             /*
            检测是否为重复用户，若该用户存在则直接响应页面:reg_have_user.html
            该页面居中显示一行字:该用户已存在，请重新注册。/爷们，你输了！重开吧！
         */
            File userFile = new File(userDir , username + ".obj");
            if (userFile.exists()) {//该文件已存在说明是重复用户
                File file = new File("./webbapps/myweb/reg_have_user.html");
                response.setEntity(file);
                return;
            }

            int age = Integer.parseInt(ageStr);//将年龄转换为int值
            //2将该用户信息保存
            //将当前用户以一个User对象行使序列化到文件中：用户名：obj
            User user = new User(username, password, nickname, age);
            try (
                    ObjectOutputStream oos = new ObjectOutputStream(
                            new FileOutputStream(
                                    userFile
                            )
                    );
            ) {
                oos.writeObject(user);
                System.out.println("写出完毕！");

                File file = new File("./webbapps/myweb/reg_success.html");
                response.setEntity(file);
            } catch (IOException e) {
                e.printStackTrace();
            }

        //3设置响应对象给用户回馈注册结果
        System.out.println("注册处理完毕！");

    }
    /**
     * 用户登录
     * @param request
     * @param response
     */
    public void login(HttpServletRequest request,HttpServletResponse response){
        System.out.println("开始处理登录...");
        String username = request.getParameter("username");
        String password = request.getParameter("password");
        if(username==null||password==null){
            File file = new File("./webbapps/myweb/login_fail.html");
            response.setEntity(file);
            return;
        }
        File userFile = new File(userDir,username+".obj");
        if(userFile.exists()){//文件存在说明该用户存在
            //反序列化读取该用户信息
            try(
                    FileInputStream fis = new FileInputStream(userFile);
                    ObjectInputStream ois = new ObjectInputStream(fis);
            ){
                User user = (User)ois.readObject();
                //比较密码
                if(password.equals(user.getPassword())){
                    //密码一致则登录成功
                    File file = new File("./webbapps/myweb/login_success.html");
                    response.setEntity(file);
                    return;
                }
            }catch(IOException | ClassNotFoundException e){
                e.printStackTrace();
            }
        }
        //设置登录失败
        File file = new File("./webbapps/myweb/login_fail.html");
        response.setEntity(file);

        System.out.println("处理登录完毕!");
    }
}

